package com.ktjy.service.impl;

import com.ktjy.entity.SysUser;
import com.ktjy.mapper.SysUserMapper;
import com.ktjy.service.SysUserService;
import com.ktjy.utils.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;

import javax.transaction.RollbackException;
import javax.transaction.Transactional;
import java.util.List;

/**
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-07 - 10:51
 */
// 等价于：<bean id="sysUserService" class="com.ktjy.service.impl.SysUserServiceImpl">
@Service("sysUserService")
// @Transactional // 为当前类中所有的方法都添加对事务的支持
public class SysUserServiceImpl implements SysUserService {

    // 等价于：<property name="sysUserMapper" ref="sysUserMapper"/>
    @Autowired
    private SysUserMapper sysUserMapper; // = new SysUserMapperImpl();   // 依赖于约定,而不依赖于具体实现,面向接口编程

   /* public void setSysUserMapper(SysUserMapper sysUserMapper) {
        this.sysUserMapper = sysUserMapper;
    }*/

    @Override
    public List<SysUser> findlist(SysUser sysUser) {
        return sysUserMapper.getSysUserList(sysUser);
    }

    // 批量保存用户信息
    // @Transactional(rollbackOn = Exception.class)
    @Override
    public int saveBatch(List<SysUser> sysUserList) {
        int rows = 0; // 用来保存新增的数据行数把(返回总受影响的行数)
        for (int i = 0; i < sysUserList.size(); i++) {
            // 拿出每一条用户信息
            SysUser sysUser = sysUserList.get(i);
            if (i == 1) { // 在插入第二条数据时
                // 模拟数据库异常，抛出异常信息，再去查看事务是否生效
                throw new RuntimeException("数据异常");
            }
            // 每插入一条数据，成功后会返回受影响行数1，记录插入的总数
            rows += sysUserMapper.insert(sysUser);
        }
        return rows; // 返回受影响的总行数
    }

    private Logger LOGGER = LoggerFactory.getLogger(SysUserServiceImpl.class);
    /**
     * 登录方法
     * @param account 登录账号
     * @param password 登录密码
     */
    @Override
    public SysUser login(String account, String password) {
        // 调用SysUserMapper接口中的getByAccount()，实现根据account登录账号查询用户信息
        SysUser loginUser = sysUserMapper.getByAccount(account);
        // 判断查询到的用户对象不为null，并且查询到的用户对象的密码与从jsp页面传递过来的密码是相等
        if (loginUser != null && loginUser.getPassword().equals(password)) {
            return loginUser; // 返回用户详情对象信息
        }
        return null;
    }

    /**
     * 按条件并分页显示用户列表数据
     * @param entity 用户实体类，它将查询条件封装到用户实体类中
     * @param pageNo 当前页码
     * @param pageSize 第二个参数，即每页显示的数据行数
     * @return
     */
    @Override
    public Page<SysUser> findPage(SysUser entity, Integer pageNo, Integer pageSize) {
        Page<SysUser> page = null;
        try {
            page = new Page<SysUser>();
            page.setPageSize(pageSize); // 每页显示的数据行数
            // 查询总的记录数
            Long count = sysUserMapper.count(entity);
            page.setPageNo(pageNo);  // 当前页码
            page.setTotalCount(count.intValue());  // 为总的记录数赋值
            // 查询分页数据
            List<SysUser> data = sysUserMapper.getPage(entity, page.offset(), page.getPageSize());
            page.setData(data);  // 将查询出来分页列表数据保存到Page类中的data属性中

        }catch (Exception e) {
            e.printStackTrace();
        }
        return page;
    }

    // 新增和修改共用一个方法
    @Override
    public boolean saveOrUpdate(SysUser sysUser) {
        try {
            if (sysUser.getId() == null) {
                return sysUserMapper.insert(sysUser) > 0; // 调用新增方法
            } else {
                return sysUserMapper.update(sysUser) > 0;  // 调用修改方法
            }
        } catch (Exception e) {
            LOGGER.error("执行SysUserSerivceImpl中的saveOrUpdate()方法出错，", e);
            throw e;
        }
    }

    // 查询用户详情信息
    @Override
    public SysUser findById(Integer id) {
        try {
            // 调用sysUserMapper中的getByID()方法实现通过用户id查询用户详情信息
            return sysUserMapper.getById(id);
        }catch (Exception e) {
            LOGGER.error("执行findById()方法报错，", e);
            e.printStackTrace();
        }
        return null;
    }
}
